package com.jcode.skeleton.service;

import java.util.List;

import javax.annotation.Resource;

import com.jcode.skeleton.dao.GenericDao;
import com.jcode.skeleton.model.Page;
import com.jcode.skeleton.model.Pageable;

/**
 * 通用GenericService实现
 *
 * @Author dreajay
 * @DateTime 2017年3月26日 下午4:13:22
 *
 */
public class GenericServiceImpl implements GenericService {

	protected GenericDao dao;

	protected String sqlNamespace;

	protected static final String SEPARATOR = ".";

	/**
	 * 
	 * @param sqlNamespace
	 */
	public GenericServiceImpl(String sqlNamespace) {
		this.sqlNamespace = sqlNamespace;
	}

	/**
	 * 
	 * @param sqlNamespace
	 * @param dao
	 */
	public GenericServiceImpl(String sqlNamespace, GenericDao dao) {
		this.sqlNamespace = sqlNamespace;
		this.dao = dao;
	}

	public GenericDao getDao() {
		return dao;
	}

	/**
	 * 注入mybatisDao，默认名称为mybatisDao，如果子类需要不同数据库的mybatisDao，需要覆盖此方法注入
	 * 
	 * @param mybatisDao
	 */
	@Resource(name = "mybatisDao")
	public void setDao(GenericDao dao) {
		this.dao = dao;
	}

	public String getSqlNamespace() {
		return sqlNamespace;
	}

	public void setSqlNamespace(String sqlNamespace) {
		this.sqlNamespace = sqlNamespace;
	}

	/**
	 * 获取SQL全限定名Statement
	 * 
	 * @param statement
	 * @return
	 */
	public String getFullQualifiedStatement(String statement) {
		return getSqlNamespace() + SEPARATOR + statement;
	}

	/**
	 * 插入对象
	 * 
	 * @param parameter
	 * @return 成功返回1，失败返回0
	 */
	public int insert(Object parameter) {
		return dao.insert(getFullQualifiedStatement("insert"), parameter);
	}

	/**
	 * 自定义插入对象
	 * 
	 * @param statement
	 * @param parameter
	 * @return 成功返回1，失败返回0
	 */
	public int insert(String statement, Object parameter) {
		return dao.insert(getFullQualifiedStatement(statement), parameter);
	}

	/**
	 * 更新对象
	 * 
	 * @param parameter
	 * @return
	 */
	public int updateByPrimaryKey(Object parameter) {
		return dao.update(getFullQualifiedStatement("updateByPrimaryKey"), parameter);
	}

	/**
	 * 自定义更新对象
	 * 
	 * @param statement
	 * @param parameter
	 * @return
	 */
	public int update(String statement, Object parameter) {
		return dao.update(getFullQualifiedStatement(statement), parameter);
	}

	/**
	 * 删除对象
	 * 
	 * @param parameter
	 * @return
	 */
	public int deleteByPrimaryKey(Object parameter) {
		return dao.delete(getFullQualifiedStatement("deleteByPrimaryKey"), parameter);
	}

	/**
	 * 批量删除对象
	 * 
	 * @param parameter
	 * @return
	 */
	public int batchDelete(Object parameter) {
		return dao.delete(getFullQualifiedStatement("batchDelete"), parameter);
	}

	/**
	 * 删除对象
	 * 
	 * @param parameter
	 * @return
	 */
	public int delete(String statement, Object parameter) {
		return dao.delete(getFullQualifiedStatement(statement), parameter);
	}

	/**
	 * 查询对象数目
	 * 
	 * @param parameter
	 * @return
	 */
	public int count(Object parameter) {
		return dao.count(getFullQualifiedStatement("count"), parameter);
	}

	/**
	 * 自定义查询对象数目
	 * 
	 * @param statement
	 * @param parameter
	 * @return
	 */
	public int count(String statement, Object parameter) {
		return dao.count(getFullQualifiedStatement(statement), parameter);
	}

	/**
	 * 查询单个对象
	 * 
	 * @param parameter
	 * @return
	 */
	public <T> T selectByPrimaryKey(Object parameter) {
		return dao.selectOne(getFullQualifiedStatement("selectByPrimaryKey"), parameter);
	}

	/**
	 * 自定义查询单个对象
	 * 
	 * @param statement
	 * @param parameter
	 * @return
	 */
	public <T> T selectOne(String statement, Object parameter) {
		return dao.selectOne(getFullQualifiedStatement(statement), parameter);
	}

	/**
	 * 查询所有对象
	 * 
	 * @param parameter
	 * @return
	 */
	public <T> List<T> selectAll(Object parameter) {
		return dao.selectList(getFullQualifiedStatement("selectAll"), parameter);
	}

	/**
	 * 分页查询
	 * 
	 * @param statement
	 * @param parameter
	 * @return
	 */
	public Page selectListByPage(String statement, Pageable parameter) {
		return dao.selectListByPage(getFullQualifiedStatement(statement), parameter);
	}

	/**
	 * 分页查询
	 * 
	 * @param parameter
	 * @return
	 */
	public Page selectListByPage(Pageable parameter) {
		return dao.selectListByPage(getFullQualifiedStatement("selectListByPage"), parameter);
	}

	/**
	 * 自定义查询对象列表
	 * 
	 * @param statement
	 * @param parameter
	 * @return
	 */
	public <T> List<T> selectList(String statement, Object parameter) {
		return dao.selectList(getFullQualifiedStatement(statement), parameter);
	}

}
